import projectConfig from '@/core/config';
import { buildGetUrl } from '@/core/http/requestUrl.js';
import { mapMutations } from 'vuex';
import { getToken, getAppId } from '@/utils';
import { Notify } from 'vant';
import dayjs from 'dayjs';
import CustomParseFormat from 'dayjs/plugin/customParseFormat';
import IsBetween from 'dayjs/plugin/isBetween';
dayjs.extend(CustomParseFormat);
dayjs.extend(IsBetween);

/**
 * 上传文件组件相关方法
 */
const uploadMixin = {
  methods: {
    /**
     * 解析返回的上传文件数据
     * @param {String} jsonData 上传文件数据，[{name, downloadUri, filename}]
     * @param {Object} params 上传文件的参数
     * @returns {Array} 上传文件信息，[{name, downloadUri, filename, url}]
     */
    parseUploadData (jsonData, params) {
      let pathList = [];
      if (jsonData != null) {
        try {
          pathList = JSON.parse(jsonData);
        } catch (e) {
          console.error(e);
        }
      }

      return Array.isArray(pathList) ? pathList.map((item) => {
        let downloadParams = {...params};
        downloadParams.filename = item.filename;
        return {
          ...item,
          url: this.getUploadFileUrl(item, downloadParams)
        }
      }) : [];
    },
    /**
     * 获得上传文件url列表
     * @param {*} jsonData 上传文件数据，[{name, downloadUri, filename}]
     * @param {*} params 上传文件的参数
     * @returns {Array} 文件url列表
     */
    getPictureList (jsonData, params) {
      let tempList = this.parseUploadData(jsonData, params);
      if (Array.isArray(tempList)) {
        return tempList.map(item => item.url);
      } else {
        return [];
      }
    },
    /**
     * 将选中文件信息格式化成json信息
     * @param {Array} fileList 上传文件列表，[{name, fileUrl, data}]
     */
    fileListToJson (fileList) {
      if (Array.isArray(fileList)) {
        return JSON.stringify(fileList.map((item) => {
          return {
            name: item.name,
            downloadUri: item.downloadUri || item.response.data.downloadUri,
            filename: item.filename || item.response.data.filename,
            uploadPath: item.uploadPath || item.response.data.uploadPath
          }
        }));
      } else {
        return undefined;
      }
    },
    /**
     * 获得上传文件url
     * @param {*} item 上传文件
     * @param {*} params 上传文件的参数
     */
    getUploadFileUrl (item, params) {
      if (item == null || item.downloadUri == null) {
        return null;
      } else {
        let menuIdJsonStr = window.sessionStorage.getItem('currentMenuId');
        let currentMenuId;
        if (menuIdJsonStr != null) {
          currentMenuId = (JSON.parse(menuIdJsonStr) || {}).data;
        }
        params.Authorization = getToken();
        params.MenuId = currentMenuId;
        params.AppCode = getAppId();
        return buildGetUrl(item.downloadUri, params);
      }
    },
    /**
     * 获得上传接口
     * @param {*} url 上传路径
     */
    getUploadActionUrl (url) {
      if (url != null && url[0] === '/') {
        url = url.substr(1);
      }
      return projectConfig.baseUrl + url;
    },
    /**
     * 上传文件是否图片文件
     * @param {*} file 上传文件
     */
    pictureFile (file) {
      if (['image/jpeg', 'image/jpg', 'image/png'].indexOf(file.type) !== -1) {
        return true;
      } else {
        Notify({ type: 'warning', message: '图片文件格式不正确，请重新选择' });
        return false;
      }
    }
  },
  computed: {
    getUploadHeaders () {
      let token = getToken();
      let appId = getAppId();
      let menuIdJsonStr = window.sessionStorage.getItem('currentMenuId');
      let currentMenuId;
      if (menuIdJsonStr != null) {
        currentMenuId = (JSON.parse(menuIdJsonStr) || {}).data;
      }
      let header = {
        Authorization: token,
        MenuId: currentMenuId
      }
      if (appId != null && appId !== '') header.AppCode = appId;
      
      return header;
    }
  }
};

const allowStatsType = [
  'time',
  'datetime',
  'day',
  'month',
  'year'
];
/**
 * 日期相关方法
 */
const statsDateRangeMixin = {
  methods: {
    /**
     * 将输入日期转化成日期范围
     * @param {*} date 输入日期
     * @param {*} statsType 转换类型（day, month, year）
     * @param {*} format 输入日期格式
     */
    getDateRangeFilter (date, statsType = 'day', format = 'YYYY-MM-DD') {
      let tempDateRange = [];
      let outFormat = 'YYYY-MM-DD HH:mm:ss';
      if (Array.isArray(date)) {
        tempDateRange[0] = dayjs(date[0], format);
        tempDateRange[1] = dayjs(date[1], format);
      } else {
        tempDateRange[0] = dayjs(date, format);
        tempDateRange[1] = dayjs(date, format);
      }
      if (!tempDateRange[0].isValid() || !tempDateRange[1].isValid()) return [];
      statsType = allowStatsType.indexOf(statsType) === -1 ? 'day' : statsType;
      console.log(tempDateRange.map((item) => item.format(outFormat)), statsType);
      switch (statsType) {
        case 'day':
          tempDateRange[0] = tempDateRange[0].startOf('day');
          tempDateRange[1] = tempDateRange[1].endOf('day');
          break;
        case 'month':
          tempDateRange[0] = tempDateRange[0].startOf('month');
          tempDateRange[1] = tempDateRange[1].endOf('month');
          break;
        case 'year':
          tempDateRange[0] = tempDateRange[0].startOf('year');
          tempDateRange[1] = tempDateRange[1].endOf('year');
          break;
        default:
          break;
      }
      return tempDateRange.map((item) => item.format(outFormat));
    },
    /**
     * 格式化日期
     * @param {Date|String} date 要格式化的日期
     * @param {String} statsType 输出日期类型
     * @param {String} format 输入日期的格式
     */
    formatDateByStatsType (date, statsType = 'day', format = 'YYYY-MM-DD') {
      if (date == null) return undefined;
      if (statsType == null) return date;
      let tempDate = dayjs(date, format);
      if (!tempDate.isValid()) return date;

      statsType = allowStatsType.indexOf(statsType) === -1 ? 'day' : statsType;
      if (statsType === 'datetime') format = 'yyyy-MM-dd HH:mm:ss';
      switch (statsType) {
        case 'time':
          return tempDate.format('HH:mm:ss');
        case 'datetime':
          return tempDate.format('YYYY-MM-DD HH:mm:ss');
        case 'day':
          return tempDate.format('YYYY-MM-DD');
        case 'month':
          return tempDate.format('YYYY-MM');
        case 'year':
          return tempDate.format('YYYY');
        default:
          return tempDate.format('YYYY-MM-DD');
      }
    },
    /**
     * 获得统计类型中文名称
     * @param {String} statsType 统计类型（day, month, year）
     */
    getStatsTypeShowName (statsType) {
      statsType = allowStatsType.indexOf(statsType) === -1 ? 'day' : statsType;
      switch (statsType) {
        case 'day': return '日统计';
        case 'month': return '月统计';
        case 'year': return '年统计';
      }
    },
    /**
     * 获取统计类型字典列表
     * @param {Array} statsTypeList 统计类型列表
     */
    getAllowStatsTypeList (statsTypeList) {
      if (Array.isArray(statsTypeList) && statsTypeList.length > 0) {
        return statsTypeList.map((item) => {
          return {
            id: item,
            name: this.getStatsTypeShowName(item)
          }
        });
      } else {
        return [];
      }
    }
  }
}

export {
  uploadMixin,
  statsDateRangeMixin
}
